#!/usr/bin/python
# -*- coding:utf-8 -*-
import redis


class UrlManager(object):
    def __init__(self):
        self.redis = redis.Redis()

    def has_url(self):
        """
        检查是否还有url
        :return: True/False
        """
        return self.redis.zcard('zh:new_urls') != 0

    def add_url(self, url):
        """
        添加一个地址到未爬取集合，如果已经爬取过或者已经添加过则不会添加
        :param url: 要添加的url地址
        """
        if url is None:
            return
        if self.redis.zscore('zh:old_urls', url) is None:  # 如果url不在爬取过的列表里面就添加，redis会自动处理
            self.redis.zadd('zh:new_urls', url,
                            2 if 'www.zhihu.com/question/' in url and len(url) == 39 else 1)
            # 插入的时候根据是否为目标链接进行排序(https://www.zhihu.com/question/31360454，类似这样的目标url长度均为39)

    def add_urls(self, urls):
        """
        添加一些地址到未爬取集合，如果存在已经爬取过或者重复的地址则不添加
        :param urls: 要添加的地址列表
        :return:
        """
        if urls is None or len(urls) == 0:
            return
        for url in urls:
            self.add_url(url)

    def get_url(self):
        """
        获取一个未爬取的url地址，并将其放入已爬取列表
        :return: 未爬取过的url地址
        """
        try:
            url = self.redis.zrevrange('zh:new_urls', 0, 0).pop()
            self.redis.zrem('zh:new_urls', url)
            self.redis.zadd('zh:old_urls', url, 1)
            return url
        except IndexError, e:
            print e
            return None
